package com.alibaba.basic.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    /**
     * 加密(不可逆加密 但是现在已经可以解密咯)
     * 不可逆加密技术，只能加密不能解密。 只能做比对，一般用来加密用户登录密
     * 们要做的是把传入进行加密和数据库查询出来密文进行比对判断密码是否正
     * 盐值：同一种加密算法，由于不同的盐值，加密出来就不一样。
     * 整个系统使用同一个盐值，多个用户共用-定义一个常量
     * 每个用户都有自己盐值，就算是相同的密码，两个用用户加密出来也不一样。
     * @param context
     */
    public static String encrypByMd5(String context) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(context.getBytes());//update处理  
            byte[] encryContext = md.digest();//调用该方法完成计算

            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < encryContext.length; offset++) {//做相应的转化（十六进制）  
                i = encryContext[offset];
                if (i < 0) i += 256;
                if (i < 16) buf.append("0");
                buf.append(Integer.toHexString(i));
            }
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block  
            e.printStackTrace();
            return null;
        }
    }
    //测试
    public static void main(String[] args) {
        //加密
        //1 生成随机盐值
        String pwd = "1";
        String salt = StrUtils.getComplexRandomString(32);
        //2 通过这个盐值加密
        String md5Pwd = MD5Utils.encrypByMd5(pwd +"yhp"+ salt+"xxxx");
        System.out.println(md5Pwd);

        //密码比对
        //1 查询盐值-就是salt
        String saltTmp = salt;
        //3 加密比对
        String pwdTmp = "1";
        String inputMd5Pwd = MD5Utils.encrypByMd5(pwdTmp +"yhp"+ saltTmp+"xxxx");
        if (inputMd5Pwd.equals(md5Pwd)){
            System.out.println("登录成功!");
        }else{
            System.out.println("密码错误");
        }
    }

}